#include "MyQCustomPlot.h"
MyQCustomPlot::MyQCustomPlot(QWidget *parent)
    : QCustomPlot(parent),typeTicker_( new QCPAxisTickerFixed )
{
    bar_ = new QCPBars(xAxis, yAxis); //初始化绘图对象
    //修改
    for (int i = 0; i < XAXIS_W; ++i)x_.append(i);//x刻度长度初始（已被写死）
    //缩放策略
    typeTicker_->setScaleStrategy( QCPAxisTickerFixed::ssMultiples );

}

MyQCustomPlot::~MyQCustomPlot()
{
}

//绘制柱状图(x，y，柱状图)格式
void MyQCustomPlot::initChart()
{

//    xAxis_->grid()->setVisible(false);                      //去除x内部网格
//    yAxis_->grid()->setVisible(false);                      //去除y内部网格

    setBackground(QBrush(Qt::transparent));           //设置背景色
    QPen pen(QColor(113,37,235));                  // 边框格式
    pen.setWidth(3);



    //柱状图格式
    bar_->setAntialiased(false);                             // 为了更好的边框效果，关闭抗齿锯
    bar_->setName("Bars");                                  // 设置图例
    bar_->setPen(QPen(QColor()));                           // 设置柱状图的边框颜色
    bar_->setBrush(QColor(4,151,70));                       // 设置柱状图的画刷颜色
    bar_->setWidth(0.95);                                   // 设置柱状图宽度
    bar_->setWidth(1);                                      // 设置柱形宽度(为无缝放置)

    //下X轴
    //xAxis_->setSubTicks(true);                    // 显示子刻度
    //xAxis_->setBasePen(Qt::NoPen);                // 修改坐标轴样式
    xAxis->setPadding(0);                           // 轴的内边距
    xAxis->setTickLength(0,8);                      // 轴内外"主刻度"的长度分别是0,4,也就是轴内的刻度线不显示
    xAxis->setSubTickLength(0,4);                   // 轴内外子刻度"的长度分别是0,4,也就是轴内的刻度线不显示
    xAxis->ticker()->setTickCount(2);               // 主刻度个数
    xAxis->setRange(0, XAXIS_W);                    // 设置x轴范围
    xAxis->setUpperEnding(QCPLineEnding::esNone);   // 无箭头
    xAxis->grid()->setSubGridVisible(true);         // 子刻度也有网格
    xAxis->setBasePen(pen);                         // 轴的样式
    //xAxis->setTickPen();

    //上X轴
    xAxis2->setVisible(true);                     //显示该轴
    xAxis2->setTicks(false);                      // 不显示刻度
    xAxis2->setBasePen(pen);                      // 轴的样式

    // 左Y轴
    //yAxis->setRange(DEFUALT_STARY, DEFUALT_ENDY); // 设置y轴范围
    yAxis->setTicks(false);                         // 不显示刻度
    yAxis->setBasePen(pen);                         // 轴的样式
    yAxis->grid()->setVisible(false);               //关闭左Y轴网格

    //右Y轴
    yAxis2->setVisible(true);                      // 显示该轴
    yAxis2->setTicks(true);                        // 显示刻度
    yAxis2->setRange(DEFUALT_STARY, DEFUALT_ENDY); // 设置y轴范围
    yAxis2->grid()->setVisible(true);              //打开右网格
    yAxis2->grid()->setSubGridVisible(true);       // 子刻度也有网格
    yAxis2->setUpperEnding(QCPLineEnding::esNone); // 无箭头
    yAxis2->setBasePen(QColor(184, 184, 248));     // 修改坐标轴样式
    yAxis2->setTickLength(0,5);                    // 轴内外"主刻度"的长度分别是0,0,也就是轴内外的刻度线不显示
    yAxis2->setSubTickLength(0,0);                 // 轴内外子刻度"的长度分别是0,0,也就是轴内外的刻度线不显示
    yAxis2->setPadding(0);                         // 轴的内边距
    yAxis2->setSubTicks(true);                     // 显示子刻度
    yAxis2->setTicker(typeTicker_);
    yAxis2->setBasePen(pen);                       // 轴的样式


    typeTicker_->setTickStep(200);//设置刻度之间的步长为1
    yAxis2->ticker()->setTickCount(1);
}

//设置Y值（长度100）
void MyQCustomPlot::setData(const QVector<double> &fossilData)
{
    if(y_ == fossilData)return;
    bar_->setData(x_, fossilData);
    y_ = fossilData;
    //若是最大值大于当前Y轴范围 -> 刷新Y轴范围
    int maxElement = *std::max_element(fossilData.begin(), fossilData.end());
    if(maxElement > yAxis2->range().upper)
    {
        int newUpper = yAxis2->range().upper + 50;
        yAxis2->setRange(0,newUpper);
        typeTicker_->setTickStep(newUpper);
    }
    replot();
    //qDebug()<<replotTime();
}


//根据坐标获取其的数据
QString MyQCustomPlot::getDataByPos(const QPoint &cursorPos)
{
//    qDebug()<<"getDataByPos";
     //QPoint globalPos = mapToGlobal(cursorPos); // 将局部坐标转换为全局坐标
    //局部像素坐标转化为轴坐标
    //QPoint localPos = mapFromGlobal(cursorPos);
    double valueX = xAxis->pixelToCoord(cursorPos.x());
    //double valueY = yAxis_->pixelToCoord(cursorPos.y());

    //四舍五入，用于取值
    int indexX = std::round(valueX);
    //int indexY = std::round(valueY);

    //横坐标不再数值范围内，不向下执行
    if (indexX < 0 || indexX >= x_.size()) return "";

    // 获取对应数据
    int showData1 = x_[indexX];
    int showData2 = y_[indexX];

    if(showData2 == 0)return "";
    QString ret;
    ret += "X:" + QString::number(showData1) + "\nY:" + QString::number(showData2);
    qDebug() << "tooltipStr:"<<ret<<"  indexX:"<<indexX<<"  indexY:"<<showData2;
    return ret;
}

////////////事件处理//////////////
void MyQCustomPlot::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
        {

            QString tooltipStr = getDataByPos(event->pos());
            if (!tooltipStr.isEmpty()) {
                QToolTip::showText(event->globalPos(), tooltipStr, this);
            }
    }
    QCustomPlot::mousePressEvent(event);
}

void MyQCustomPlot::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
          QToolTip::hideText();
      }
      // 调用基类的鼠标释放事件处理函数
      QCustomPlot::mouseReleaseEvent(event);
}

////////////////////////////////
